/*!
 * \file WtExecMgr.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 执行管理器头文件
 * 
 * 本文件定义了执行管理器类，主要功能包括：
 * - 多执行器的统一管理和调度
 * - 持仓目标的分发和处理
 * - 过滤器的集成和应用
 * - 行情数据的转发处理
 * 
 * WtExecuterMgr是WonderTrader系统中连接策略引擎和具体执行器的
 * 中间层，负责将策略信号转换为具体的执行指令。
 */
#pragma once
#include <functional>
#include "WtLocalExecuter.h"

NS_WTP_BEGIN
class WtFilterMgr;

/**
 * @brief 执行器枚举回调函数类型
 * @param executer 执行器智能指针
 * 
 * 用于遍历所有执行器时的回调函数类型定义
 */
typedef std::function<void(ExecCmdPtr)> EnumExecuterCb;

/**
 * @class WtExecuterMgr
 * @brief 执行管理器类
 * 
 * 执行管理器是WonderTrader系统中的核心组件之一，主要功能包括：
 * 1. 执行器管理：添加、枚举和管理多个执行器实例
 * 2. 持仓分发：将策略的目标持仓分发给各个执行器
 * 3. 过滤控制：集成过滤管理器，对信号进行过滤处理
 * 4. 行情转发：将实时行情数据转发给所有执行器
 * 5. 持仓变化处理：处理单个合约的持仓变化事件
 * 
 * 该类采用了boost::noncopyable设计，确保管理器实例的唯一性，
 * 通过统一的接口管理多个执行器，实现策略信号的高效分发。
 */
class WtExecuterMgr : private boost::noncopyable
{
public:
	/**
	 * @brief 构造函数
	 * 
	 * 初始化执行管理器，设置过滤管理器为空
	 */
	WtExecuterMgr():_filter_mgr(NULL){}

	/**
	 * @brief 设置过滤管理器
	 * @param mgr 过滤管理器指针
	 * 
	 * 设置过滤管理器，用于对执行信号进行过滤处理
	 */
	inline void set_filter_mgr(WtFilterMgr* mgr) { _filter_mgr = mgr; }

	/**
	 * @brief 添加执行器
	 * @param executer 执行器智能指针
	 * 
	 * 将新的执行器添加到管理器中，用于后续的信号分发
	 */
	inline void	add_executer(ExecCmdPtr executer)
	{
		_executers.emplace_back(executer);
	}

	/**
	 * @brief 枚举所有执行器
	 * @param cb 枚举回调函数
	 * 
	 * 遍历所有已注册的执行器，对每个执行器调用回调函数
	 */
	void	enum_executer(EnumExecuterCb cb);

	/**
	 * @brief 设置目标持仓
	 * @param target_pos 目标持仓映射表(合约代码->持仓数量)
	 * 
	 * 将策略的目标持仓分发给所有执行器，
	 * 在分发前会通过过滤器进行过滤处理
	 */
	void	set_positions(faster_hashmap<LongKey, double> target_pos);
	
	/**
	 * @brief 处理持仓变化
	 * @param stdCode 标准合约代码
	 * @param targetPos 目标持仓数量
	 * 
	 * 处理单个合约的持仓变化，将变化通知给所有执行器
	 */
	void	handle_pos_change(const char* stdCode, double targetPos);
	
	/**
	 * @brief 处理行情数据
	 * @param stdCode 标准合约代码
	 * @param curTick 当前tick数据
	 * 
	 * 将实时行情数据转发给所有执行器进行处理
	 */
	void	handle_tick(const char* stdCode, WTSTickData* curTick);

private:
	typedef std::vector<ExecCmdPtr> ExecuterList;	///< 执行器列表类型定义
	ExecuterList	_executers;						///< 执行器列表

	WtFilterMgr*	_filter_mgr;					///< 过滤管理器指针
};
NS_WTP_END
